package vip.george.p1041;

public class P1041 {

    /**
     * 判断机器人是否永远无法离开
     *
     * 通过分析，只有机器人通过多次循环移动（最快1次最慢4次），且循环后回到初始位置0,0（无论什么方向），则机器人永远无法离开
     * @param instructions
     * @return
     */

    public boolean isRobotBounded(String instructions) {
        // 如果指令中没有G，则表示机器人只是单纯的移动方向，没有前进一步
        if (!instructions.contains("G")) {
            return true;
        }
        // 初始位置
        int x = 0, y = 0;
        // 初始方向 (0北， 1东，2南，3西 。这样的好处是方便后面通过表达式计算移动后的位置)
        int direction = 0;


        //因为要一直重复instructions，并且可能多次循环才能形成"环"。假如多次循环最后能形成"环"，最多只要4次。
        for (int i = 0; i < 4; i++) {
            for (char instruction : instructions.toCharArray()) {
                switch (instruction) {
                    case 'L':
//                        switch ( direction) {
//                            case 0:
//                                direction = 3;
//                                break;
//                            case 1:
//                                direction = 0;
//                                break;
//                            case 2:
//                                direction = 1;
//                                break;
//                            case 3:
//                                direction = 2;
//                                break;
//                        }
                        direction = (direction + 3) % 4;
                        break;
                    case 'R':
                        direction = (direction + 1) % 4;
                        break;
                    case 'G':
                        if (direction == 0) {
                            y++;
                        } else if (direction == 1) {
                            x++;
                        } else if (direction == 2) {
                            y--;
                        } else if (direction == 3) {
                            x--;
                        }
                }
            }
            //每一次循环走完，如果回到了原点，则不用循环4次也表明形成了环
            if (x == 0 && y == 0) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        P1041 p = new P1041();
        System.out.println(p.isRobotBounded("GGLLGG"));
        System.out.println(p.isRobotBounded("GG"));
        System.out.println(p.isRobotBounded("GL"));
        System.out.println(p.isRobotBounded("LRRRRLLLRL"));
    }
}
